Profile plots of promoters, enhancders and significant peaks
determined by DESeq2.
bw_dir <- "/Volumes/DATA/DATA/Puck/bigwig/"
library("wigglescout")
library("ggpubr")
Loading required package: ggplot2
library("ggplot2")
library("DESeq2")
Loading required package: S4Vectors
Warning: package ‘S4Vectors’ was built under R version 4.2.2Loading required package: stats4
Loading required package: BiocGenerics
Attaching package: ‘BiocGenerics’
The following objects are masked from ‘package:stats’:
IQR, mad, sd, var, xtabs
The following objects are masked from ‘package:base’:
anyDuplicated, aperm, append, as.data.frame, basename, cbind, colnames,
dirname, do.call, duplicated, eval, evalq, Filter, Find, get, grep, grepl,
intersect, is.unsorted, lapply, Map, mapply, match, mget, order, paste, pmax,
pmax.int, pmin, pmin.int, Position, rank, rbind, Reduce, rownames, sapply,
setdiff, sort, table, tapply, union, unique, unsplit, which.max, which.min
Attaching package: ‘S4Vectors’
The following objects are masked from ‘package:base’:
expand.grid, I, unname
Loading required package: IRanges
Loading required package: GenomicRanges
Warning: package ‘GenomicRanges’ was built under R version 4.2.2Loading required package: GenomeInfoDb
Warning: package ‘GenomeInfoDb’ was built under R version 4.2.2Loading required package: SummarizedExperiment
Loading required package: MatrixGenerics
Loading required package: matrixStats
Attaching package: ‘MatrixGenerics’
The following objects are masked from ‘package:matrixStats’:
colAlls, colAnyNAs, colAnys, colAvgsPerRowSet, colCollapse, colCounts,
colCummaxs, colCummins, colCumprods, colCumsums, colDiffs, colIQRDiffs,
colIQRs, colLogSumExps, colMadDiffs, colMads, colMaxs, colMeans2, colMedians,
colMins, colOrderStats, colProds, colQuantiles, colRanges, colRanks,
colSdDiffs, colSds, colSums2, colTabulates, colVarDiffs, colVars,
colWeightedMads, colWeightedMeans, colWeightedMedians, colWeightedSds,
colWeightedVars, rowAlls, rowAnyNAs, rowAnys, rowAvgsPerColSet, rowCollapse,
rowCounts, rowCummaxs, rowCummins, rowCumprods, rowCumsums, rowDiffs,
rowIQRDiffs, rowIQRs, rowLogSumExps, rowMadDiffs, rowMads, rowMaxs, rowMeans2,
rowMedians, rowMins, rowOrderStats, rowProds, rowQuantiles, rowRanges,
rowRanks, rowSdDiffs, rowSds, rowSums2, rowTabulates, rowVarDiffs, rowVars,
rowWeightedMads, rowWeightedMeans, rowWeightedMedians, rowWeightedSds,
rowWeightedVars
Loading required package: Biobase
Welcome to Bioconductor
Vignettes contain introductory material; view with 'browseVignettes()'. To
cite Bioconductor, see 'citation("Biobase")', and for packages
'citation("pkgname")'.
Attaching package: ‘Biobase’
The following object is masked from ‘package:MatrixGenerics’:
rowMedians
The following objects are masked from ‘package:matrixStats’:
anyMissing, rowMedians
library("dplyr")
Attaching package: ‘dplyr’
The following object is masked from ‘package:Biobase’:
combine
The following object is masked from ‘package:matrixStats’:
count
The following objects are masked from ‘package:GenomicRanges’:
intersect, setdiff, union
The following object is masked from ‘package:GenomeInfoDb’:
intersect
The following objects are masked from ‘package:IRanges’:
collapse, desc, intersect, setdiff, slice, union
The following objects are masked from ‘package:S4Vectors’:
first, intersect, rename, setdiff, setequal, union
The following objects are masked from ‘package:BiocGenerics’:
combine, intersect, setdiff, union
The following objects are masked from ‘package:stats’:
filter, lag
The following objects are masked from ‘package:base’:
intersect, setdiff, setequal, union
library("ggrastr")
clean <- function (fn) {
fn <- gsub(pattern = ".+/", "", x = fn)
fn <- gsub(pattern = ".mm9.+", "", x = fn)
fn <- gsub(pattern = ".mm39.+", "", x = fn)
fn <- gsub(pattern = "_S.+", "", x = fn)
fn <- gsub(pattern = "_combined.+", "", x = fn)
fn <- gsub(pattern = "G4 CnT ", "", x = fn)
fn <- gsub(pattern = "_batch2", "", x = fn)
fn <- gsub(pattern = "-", " ", x = fn)
fn <- gsub(pattern = "_", " ", x = fn)
fn <- gsub(pattern = " HA ", " ", x = fn)
fn <- gsub(pattern = "D1D6", "FANCJ-/-", x = fn)
fn <- gsub(pattern = "P2D2", "DHX36-/-", x = fn)
fn <- gsub(pattern = "P3D4", "FANCJ-/-DHX36-/-", x = fn)
return(fn)
}
BWs <- paste0(bw_dir,list.files(bw_dir,pattern="G4_.+_combined.bw"))
mypal <-c("cornflowerblue","orange","red2","#505050")
mypal3 <-c("cornflowerblue","cornflowerblue","cornflowerblue","orange","orange","orange","red2","red","red2","black","black","black")
mypal2 <-c("cornflowerblue","cornflowerblue","orange","orange","red2","red","black","black")
#non-significant Peaks

Active Enhancers


ggsave("plots/profile_G4_DHX36.pdf",plot_profile_G4_DHX36,width = 3, height= 3)
ggsave("plots/profile_G4_FANCJ.pdf",plot_profile_G4_FANCJ,width = 3, height= 3)
ggsave("plots/profile_G4_DKO.pdf",plot_profile_G4_DKO,width = 3, height= 3)
ggsave("plots/profile_G4_nonsig.pdf",plot_profile_G4_nonsig,width = 3, height= 3)
ggsave("plots/profile_G4_ProAct.pdf",plot_profile_G4_proact,width = 3, height= 3)
Error in plot_theme(plot) : object 'plot_profile_G4_proact' not found
Heatmaps

ggsave("panels/heatmap_G4.pdf",plot_heatmap_G4,width = 6, height= 3)
library(cowplot)
Attaching package: ‘cowplot’
The following object is masked from ‘package:ggpubr’:
get_legend
p <- ggdraw() +
draw_plot(plot_profile_G4_DHX36, x = 0, y = 0, width = .33, height = 1) +
draw_plot(plot_profile_G4_nonsig, x = .33, y = 0, width = .33, height = 1) +
draw_plot(plot_profile_G4_enhact, x = 0.66, y = 0, width = .33, height = 1)
p

ggsave("panels/profiles_G4_peak_enh.pdf",p,width=8, height=3)
p <- ggdraw() +
draw_plot(plot_heatmap_G4, x = .0, y = 0, width = .5, height = 1) +
draw_plot(plot_profile_G4_DHX36, x = .5, y = 0.5, width = .25, height = .5) +
draw_plot(plot_profile_G4_FANCJ, x = .5, y = 0, width = .25, height = .5) +
draw_plot(plot_profile_G4_DKO, x = .75, y = 0.5, width = .25, height = .5) +
draw_plot(plot_profile_G4_nonsig, x = 0.75, y = 0, width = .25, height = .5)
p

ggsave("panels/heatmap_G4_peaks.pdf",p,width=10, height=5)
p <- ggdraw() +
draw_plot(plot_heatmap_G4, x = .0, y = 0, width = .5, height = 1) +
draw_plot(plot_profile_G4_DKO, x = .5, y = 0.5, width = .25, height = .5) +
draw_plot(plot_profile_G4_nonsig, x = .5, y = 0, width = .25, height = .5) +
draw_plot(plot_profile_G4_proact, x = .75, y = 0.5, width = .25, height = .5) +
draw_plot(plot_profile_G4_enhact, x = 0.75, y = 0, width = .25, height = .5)
p

ggsave("panels/heatmap_G4_peaks_pro_enh.pdf",p,width=10, height=5)
R loops




ggsave("plots/profile_Rloop_DHX36.pdf",plot_profile_Rloop_DHX36,width = 3, height= 3)
ggsave("plots/profile_Rloop_FANCJ.pdf",plot_profile_Rloop_FANCJ,width = 3, height= 3)
ggsave("plots/profile_Rloop_DKO.pdf",plot_profile_Rloop_DKO,width = 3, height= 3)
ggsave("plots/profile_Rloop_nonsig.pdf",plot_profile_Rloop_nonsig,width = 3, height= 3)

p <- ggdraw() +
draw_plot(plot_heatmap_Rloop, x = .0, y = 0, width = .5, height = 1) +
draw_plot(plot_profile_Rloop_DHX36, x = .5, y = 0.5, width = .25, height = .5) +
draw_plot(plot_profile_Rloop_FANCJ, x = .5, y = 0, width = .25, height = .5) +
draw_plot(plot_profile_Rloop_DKO, x = .75, y = 0.5, width = .25, height = .5) +
draw_plot(plot_profile_Rloop_nonsig, x = 0.75, y = 0, width = .25, height = .5)
p

ggsave("panels/peak_Rloop_heatmap.pdf",p,width=10, height=5)
p <- ggdraw() +
draw_plot(plot_profile_Rloop_DHX36, x = 0, y = 0, width = .33, height = 1) +
draw_plot(plot_profile_Rloop_DKO, x = .33, y = 0, width = .33, height = 1) +
draw_plot(plot_profile_Rloop_nonsig, x = 0.66, y = 0, width = .33, height = 1)
p

ggsave("panels/peak_Rloop_profiles.pdf",p,width=8, height=3)

mdf <- melt(df)
ggviolin(mdf, x="variable",y="value",fill="variable",palette = mypal, add="mean_sd") +
coord_cartesian(ylim=c(0,15))
LS0tCnRpdGxlOiAiRzQgQ1VUJlRhZyBhbmFseXNpcyBtRVNDIChXVCwgRkFOQ0ogS08sIERIWDM2IEtPLCBES08pIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgpTaW1vbiBFbHPDpHNzZXIsIEthcm9saW5za2EgSW5zdGl0dXRldCAoMjAyMykKCiMjIyBQcm9maWxlIHBsb3RzIG9mIHByb21vdGVycywgZW5oYW5jZGVycyBhbmQgc2lnbmlmaWNhbnQgcGVha3MgZGV0ZXJtaW5lZCBieSBERVNlcTIuCgpgYGB7ciBmaWcud2lkdGg9NiwgZmlnLmhlaWdodD0zfQpid19kaXIgPC0gIi9Wb2x1bWVzL0RBVEEvREFUQS9QdWNrL2JpZ3dpZy8iCgpsaWJyYXJ5KCJ3aWdnbGVzY291dCIpCmxpYnJhcnkoImdncHViciIpCmxpYnJhcnkoImdncGxvdDIiKQpsaWJyYXJ5KCJERVNlcTIiKQpsaWJyYXJ5KCJkcGx5ciIpCmxpYnJhcnkoImdncmFzdHIiKQoKY2xlYW4gPC0gZnVuY3Rpb24gKGZuKSB7CiAgZm4gPC0gZ3N1YihwYXR0ZXJuID0gIi4rLyIsICIiLCB4ID0gZm4pCiAgZm4gPC0gZ3N1YihwYXR0ZXJuID0gIi5tbTkuKyIsICIiLCB4ID0gZm4pCiAgZm4gPC0gZ3N1YihwYXR0ZXJuID0gIi5tbTM5LisiLCAiIiwgeCA9IGZuKQogIGZuIDwtIGdzdWIocGF0dGVybiA9ICJfUy4rIiwgIiIsIHggPSBmbikKICBmbiA8LSBnc3ViKHBhdHRlcm4gPSAiX2NvbWJpbmVkLisiLCAiIiwgeCA9IGZuKQogIGZuIDwtIGdzdWIocGF0dGVybiA9ICJHNCBDblQgIiwgIiIsIHggPSBmbikKICBmbiA8LSBnc3ViKHBhdHRlcm4gPSAiX2JhdGNoMiIsICIiLCB4ID0gZm4pCiAgZm4gPC0gZ3N1YihwYXR0ZXJuID0gIi0iLCAiICIsIHggPSBmbikKICBmbiA8LSBnc3ViKHBhdHRlcm4gPSAiXyIsICIgIiwgeCA9IGZuKQogIGZuIDwtIGdzdWIocGF0dGVybiA9ICIgSEEgIiwgIiAiLCB4ID0gZm4pCiAgZm4gPC0gZ3N1YihwYXR0ZXJuID0gIkQxRDYiLCAiRkFOQ0otLy0iLCB4ID0gZm4pCiAgZm4gPC0gZ3N1YihwYXR0ZXJuID0gIlAyRDIiLCAiREhYMzYtLy0iLCB4ID0gZm4pCiAgZm4gPC0gZ3N1YihwYXR0ZXJuID0gIlAzRDQiLCAiRkFOQ0otLy1ESFgzNi0vLSIsIHggPSBmbikKICByZXR1cm4oZm4pCn0KCkJXcyA8LSBwYXN0ZTAoYndfZGlyLGxpc3QuZmlsZXMoYndfZGlyLHBhdHRlcm49Ikc0Xy4rX2NvbWJpbmVkLmJ3IikpCgpteXBhbCA8LWMoImNvcm5mbG93ZXJibHVlIiwib3JhbmdlIiwicmVkMiIsIiM1MDUwNTAiKQpteXBhbDMgPC1jKCJjb3JuZmxvd2VyYmx1ZSIsImNvcm5mbG93ZXJibHVlIiwiY29ybmZsb3dlcmJsdWUiLCJvcmFuZ2UiLCJvcmFuZ2UiLCJvcmFuZ2UiLCJyZWQyIiwicmVkIiwicmVkMiIsImJsYWNrIiwiYmxhY2siLCJibGFjayIpCm15cGFsMiA8LWMoImNvcm5mbG93ZXJibHVlIiwiY29ybmZsb3dlcmJsdWUiLCJvcmFuZ2UiLCJvcmFuZ2UiLCJyZWQyIiwicmVkIiwiYmxhY2siLCJibGFjayIpCmBgYAoKIyMgREhYMzYtLy0gdnMgV1Qgc2lnbmlmaWNhbnQgcGVha3MKYGBge3IgZmlnLndpZHRoPTMsIGZpZy5oZWlnaHQ9MywgZXJyb3I9RixlY2hvPUYscHJvbXB0PUYsd2FybmluZz1GfQpwbG90X3Byb2ZpbGVfRzRfREhYMzYgPC0gcGxvdF9id19wcm9maWxlKGJ3ZmlsZXMgPSBCV3MsbG9jaSA9ICIuLi9wZWFrcy9HNF9DblRfY29tYmluZWRfcGVha3NfREVTZXFfREhYMzZfc2lnLmJlZCIsIG1vZGU9ImNlbnRlciIsIGxhYmVscyA9IGNsZWFuKEJXcyksc2hvd19lcnJvcj1ULGNvbG9ycyA9IG15cGFsLCB2ZXJib3NlPUYpICsgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cz1jKDAsNDApKQpwbG90X3Byb2ZpbGVfRzRfREhYMzYKYGBgCgoKIyMgRkFOQ0otLy0gdnMgV1Qgc2lnbmlmaWNhbnQgcGVha3MKYGBge3IgZmlnLndpZHRoPTMsIGZpZy5oZWlnaHQ9MywgZXJyb3I9RixlY2hvPUYscHJvbXB0PUYsd2FybmluZz1GfQpwbG90X3Byb2ZpbGVfRzRfRkFOQ0ogPC0gcGxvdF9id19wcm9maWxlKGJ3ZmlsZXMgPSBCV3MsbG9jaSA9ICIuLi9wZWFrcy9HNF9DblRfY29tYmluZWRfcGVha3NfREVTZXFfRkFOQ0pfc2lnLmJlZCIsIG1vZGU9ImNlbnRlciIsIGxhYmVscyA9IGNsZWFuKEJXcyksc2hvd19lcnJvcj1ULGNvbG9ycyA9IG15cGFsLCB2ZXJib3NlPUYpICsgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cz1jKDAsNDApKQpwbG90X3Byb2ZpbGVfRzRfRkFOQ0oKYGBgCgojIyBES08tLy0gdnMgV1Qgc2lnbmlmaWNhbnQgcGVha3MKYGBge3IgZmlnLndpZHRoPTMsIGZpZy5oZWlnaHQ9MywgZXJyb3I9RixlY2hvPUYscHJvbXB0PUYsd2FybmluZz1GfQpwbG90X3Byb2ZpbGVfRzRfREtPIDwtIHBsb3RfYndfcHJvZmlsZShid2ZpbGVzID0gQldzLGxvY2kgPSAiLi4vcGVha3MvRzRfQ25UX2NvbWJpbmVkX3BlYWtzX0RFU2VxX0RLT19zaWcuYmVkIiwgbW9kZT0iY2VudGVyIiwgbGFiZWxzID0gY2xlYW4oQldzKSxzaG93X2Vycm9yPVQsY29sb3JzID0gbXlwYWwsIHZlcmJvc2U9RikgICsgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cz1jKDAsNDApKQpwbG90X3Byb2ZpbGVfRzRfREtPCmBgYAoKCiMjIERLTy0vLSB2cyBXVCBzaWduaWZpY2FudCBwZWFrcwpgYGB7ciBmaWcud2lkdGg9MywgZmlnLmhlaWdodD0zLCBlcnJvcj1GLGVjaG89Rixwcm9tcHQ9Rix3YXJuaW5nPUZ9CkJXcyA8LSBwYXN0ZTAoYndfZGlyLGxpc3QuZmlsZXMoYndfZGlyLHBhdHRlcm49Ikc0Xy4rX2NvbWJpbmVkLnVuaXF1ZS5idyIpKQpwbG90X2J3X3Byb2ZpbGUoYndmaWxlcyA9IEJXcyxsb2NpID0gIi4uL3BlYWtzL0c0X0NuVF9jb21iaW5lZF9wZWFrc19ERVNlcV9ES09fc2lnX2xmY19iYXNlX2N1dG9mZi5iZWQiLCBtb2RlPSJjZW50ZXIiLCBsYWJlbHMgPSBjbGVhbihCV3MpLHNob3dfZXJyb3I9VCxjb2xvcnMgPSBteXBhbCwgdmVyYm9zZT1GKSAgKyBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzPWMoMCw0MCkpCmBgYAoKIyMgTUFDUyBwZWFrIGludGVyc2VjdCBub3QgY2FsbGVkIGluIFdUCmBgYHtyIGZpZy53aWR0aD0zLCBmaWcuaGVpZ2h0PTMsIGVycm9yPUYsZWNobz1GLHByb21wdD1GLHdhcm5pbmc9Rn0KcGxvdF9id19wcm9maWxlKGJ3ZmlsZXMgPSBCV3MsbG9jaSA9ICIuLi9wZWFrcy9HNF9jb21iaW5lZF9taW4zcmVwX25vdF9XVC5iZWQiLCBtb2RlPSJjZW50ZXIiLCBsYWJlbHMgPSBjbGVhbihCV3MpLHNob3dfZXJyb3I9VCxjb2xvcnMgPSBteXBhbCwgdmVyYm9zZT1GKQpgYGAKIyAjbm9uLXNpZ25pZmljYW50IFBlYWtzCmBgYHtyIGZpZy53aWR0aD0zLCBmaWcuaGVpZ2h0PTMsIGVycm9yPUYsZWNobz1GLHByb21wdD1GLHdhcm5pbmc9Rn0KcGxvdF9wcm9maWxlX0c0X25vbnNpZyA8LSBwbG90X2J3X3Byb2ZpbGUoYndmaWxlcyA9IEJXcyxsb2NpID0gIi4uL3BlYWtzL0c0X0NuVF9jb21iaW5lZF9wZWFrc19ERVNlcV9ub25zaWcuYmVkIiwgbW9kZT0iY2VudGVyIiwgbGFiZWxzID0gY2xlYW4oQldzKSxzaG93X2Vycm9yPVQsY29sb3JzID0gbXlwYWwsIHZlcmJvc2U9RikgICsgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cz1jKDAsNDApKQpwbG90X3Byb2ZpbGVfRzRfbm9uc2lnCmBgYAoKIyMgQWN0aXZlIFByb21vdGVycwpgYGB7ciBmaWcud2lkdGg9MywgZmlnLmhlaWdodD0zLCBlcnJvcj1GLGVjaG89Rixwcm9tcHQ9Rix3YXJuaW5nPUZ9CnBsb3RfcHJvZmlsZV9HNF9wcm9hY3QgPC0gcGxvdF9id19wcm9maWxlKGJ3ZmlsZXMgPSBCV3MsbG9jaSA9ICIuLi9nZW5vbWUvZ2VuZXNfaGlfMS0xMGtiLm1tMzkuYmVkIiwgbW9kZT0ic3RhcnQiLCBsYWJlbHMgPSBjbGVhbihCV3MpLHNob3dfZXJyb3I9VCxjb2xvcnMgPSBteXBhbCwgdmVyYm9zZT1GKQpwbG90X3Byb2ZpbGVfRzRfcHJvYWN0CmBgYApgYGB7ciBmaWcud2lkdGg9MywgZmlnLmhlaWdodD0zLCBlcnJvcj1GLGVjaG89Rixwcm9tcHQ9Rix3YXJuaW5nPUZ9CnBsb3RfcHJvZmlsZV9HNF9wcm9iaXYgPC0gcGxvdF9id19wcm9maWxlKGJ3ZmlsZXMgPSBCV3MsbG9jaSA9ICIuLi9nZW5vbWUvSzI3X2JpdmFsZW50X2dlbmVzLm1tMzkuYmVkIiwgbW9kZT0ic3RhcnQiLCBsYWJlbHMgPSBjbGVhbihCV3MpLHNob3dfZXJyb3I9VCxjb2xvcnMgPSBteXBhbCwgdmVyYm9zZT1GKSArIHNjYWxlX3lfY29udGludW91cyhsaW1pdHM9YygwLDQwKSkKcGxvdF9wcm9maWxlX0c0X3Byb2JpdgpgYGAKCiMjIEFjdGl2ZSBFbmhhbmNlcnMKYGBge3IgZmlnLndpZHRoPTMsIGZpZy5oZWlnaHQ9MywgZXJyb3I9RixlY2hvPUYscHJvbXB0PUYsd2FybmluZz1GfQpwbG90X3Byb2ZpbGVfRzRfZW5oYWN0IDwtIHBsb3RfYndfcHJvZmlsZShid2ZpbGVzID0gQldzLGxvY2kgPSAiLi4vZ2Vub21lL0VTQ19FbmhhbmNlcl9DcnV6TW9saW5hLmFjdGl2ZS5tbTM5LmJlZCIsIG1vZGU9ImNlbnRlciIsIGxhYmVscyA9IGNsZWFuKEJXcyksc2hvd19lcnJvcj1ULGNvbG9ycyA9IG15cGFsLCB2ZXJib3NlPUYpICsgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cz1jKDAsNDApKQpwbG90X3Byb2ZpbGVfRzRfZW5oYWN0CmBgYApgYGB7ciBmaWcud2lkdGg9MywgZmlnLmhlaWdodD0zLCBlcnJvcj1GLGVjaG89Rixwcm9tcHQ9Rix3YXJuaW5nPUZ9CnBsb3RfcHJvZmlsZV9HNF9lbmhwcmkgPC0gcGxvdF9id19wcm9maWxlKGJ3ZmlsZXMgPSBCV3MsbG9jaSA9ICIuLi9nZW5vbWUvRVNDX0VuaGFuY2VyX0NydXpNb2xpbmEucHJpbWVkLm1tMzkuYmVkIiwgbW9kZT0iY2VudGVyIiwgbGFiZWxzID0gY2xlYW4oQldzKSxzaG93X2Vycm9yPVQsY29sb3JzID0gbXlwYWwsIHZlcmJvc2U9RikgKyBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzPWMoMCwyNSkpCnBsb3RfcHJvZmlsZV9HNF9lbmhwcmkKYGBgCgpgYGB7ciBmaWcud2lkdGg9MywgZmlnLmhlaWdodD0zLCBlcnJvcj1GLGVjaG89Rixwcm9tcHQ9Rix3YXJuaW5nPUZ9CnBsb3RfcHJvZmlsZV9HNF9lbmhwb2kgPC0gcGxvdF9id19wcm9maWxlKGJ3ZmlsZXMgPSBCV3MsbG9jaSA9ICIuLi9nZW5vbWUvRVNDX0VuaGFuY2VyX0NydXpNb2xpbmEucG9pc2VkLm1tMzkuYmVkIiwgbW9kZT0iY2VudGVyIiwgbGFiZWxzID0gY2xlYW4oQldzKSxzaG93X2Vycm9yPVQsY29sb3JzID0gbXlwYWwsIHZlcmJvc2U9RikgKyBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzPWMoMCw0MCkpCnBsb3RfcHJvZmlsZV9HNF9lbmhwb2kKYGBgCgpgYGB7cn0KZ2dzYXZlKCJwbG90cy9wcm9maWxlX0c0X0RIWDM2LnBkZiIscGxvdF9wcm9maWxlX0c0X0RIWDM2LHdpZHRoID0gMywgaGVpZ2h0PSAzKQpnZ3NhdmUoInBsb3RzL3Byb2ZpbGVfRzRfRkFOQ0oucGRmIixwbG90X3Byb2ZpbGVfRzRfRkFOQ0osd2lkdGggPSAzLCBoZWlnaHQ9IDMpCmdnc2F2ZSgicGxvdHMvcHJvZmlsZV9HNF9ES08ucGRmIixwbG90X3Byb2ZpbGVfRzRfREtPLHdpZHRoID0gMywgaGVpZ2h0PSAzKQpnZ3NhdmUoInBsb3RzL3Byb2ZpbGVfRzRfbm9uc2lnLnBkZiIscGxvdF9wcm9maWxlX0c0X25vbnNpZyx3aWR0aCA9IDMsIGhlaWdodD0gMykKZ2dzYXZlKCJwbG90cy9wcm9maWxlX0c0X1Byb0FjdC5wZGYiLHBsb3RfcHJvZmlsZV9HNF9wcm9hY3Qsd2lkdGggPSAzLCBoZWlnaHQ9IDMpCmdnc2F2ZSgicGxvdHMvcHJvZmlsZV9HNF9Qcm9CaXYucGRmIixwbG90X3Byb2ZpbGVfRzRfcHJvYml2LHdpZHRoID0gMywgaGVpZ2h0PSAzKQpnZ3NhdmUoInBsb3RzL3Byb2ZpbGVfRzRfRW5oQWN0LnBkZiIscGxvdF9wcm9maWxlX0c0X2VuaGFjdCx3aWR0aCA9IDMsIGhlaWdodD0gMykKYGBgIAoKIyMjIEhlYXRtYXBzCgpgYGB7ciBmaWcud2lkdGg9NiwgZmlnLmhlaWdodD0zLCBlcnJvcj1GLGVjaG89Rixwcm9tcHQ9Rix3YXJuaW5nPUZ9CmJlZF9zcmMgPC0gcmVhZC50YWJsZSgiLi4vcGVha3MvRzRfQ25UX2NvbWJpbmVkX3BlYWtzX0RFU2VxX3NpZ19jYXRlZ29yaWVzLmJlZCIsIGhlYWRlciA9IEYsIHNlcCA9ICJcdCIpCmgxIDwtIGJ3X2hlYXRtYXAoQldzWzRdLGxvY2k9Ii4uL3BlYWtzL0c0X0NuVF9jb21iaW5lZF9wZWFrc19ERVNlcV9zaWdfY2F0ZWdvcmllcy5iZWQiLCBtb2RlPSJjZW50ZXIiKQpvcmQgPC0gb3JkZXIoYmVkX3NyYyRWNSAqIDEwMDAgKyByb3dNZWFucyhoMVtbMV1dKSkKem1heCA8LSA0MApwMSA8LSBwbG90X2J3X2hlYXRtYXAoQldzWzRdLCIuLi9wZWFrcy9HNF9jb21iaW5lZF9taW4zcmVwLmJlZCIsIG1vZGU9ImNlbnRlciIsIHZlcmJvc2U9Rix6bWF4ID0gem1heCwgb3JkZXJfYnkgPSBvcmQpCnAyIDwtIHBsb3RfYndfaGVhdG1hcChCV3NbMl0sIi4uL3BlYWtzL0c0X2NvbWJpbmVkX21pbjNyZXAuYmVkIiwgbW9kZT0iY2VudGVyIiwgdmVyYm9zZT1GLHptYXggPSB6bWF4LCBvcmRlcl9ieSA9IG9yZCkKcDMgPC0gcGxvdF9id19oZWF0bWFwKEJXc1sxXSwiLi4vcGVha3MvRzRfY29tYmluZWRfbWluM3JlcC5iZWQiLCBtb2RlPSJjZW50ZXIiLCB2ZXJib3NlPUYsem1heCA9IHptYXgsIG9yZGVyX2J5ID0gb3JkKQpwNCA8LSBwbG90X2J3X2hlYXRtYXAoQldzWzNdLCIuLi9wZWFrcy9HNF9jb21iaW5lZF9taW4zcmVwLmJlZCIsIG1vZGU9ImNlbnRlciIsIHZlcmJvc2U9Rix6bWF4ID0gem1heCwgb3JkZXJfYnkgPSBvcmQpCmRmIDwtIGFzLmRhdGEuZnJhbWUodGFibGUoYmVkX3NyYyRWNSkpCmRmJGNvbD0xCnA1IDwtIGdnYmFycGxvdChkZiwiY29sIiwiRnJlcSIsZmlsbD0iVmFyMSIsIHBvc2l0aW9uID0gcG9zaXRpb25fc3RhY2socmV2ZXJzZSA9IFRSVUUpLCB3aWR0aCA9IDAuMSkgKyB0aGVtZV92b2lkKCkgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpCnBsb3RfaGVhdG1hcF9HNCA8LSBnZ2FycmFuZ2UocDEscDIscDMscDQscDUsY29tbW9uLmxlZ2VuZCA9IFQsIG5jb2wgPSA1KQpwbG90X2hlYXRtYXBfRzQKYGBgCgpgYGB7cn0KZ2dzYXZlKCJwYW5lbHMvaGVhdG1hcF9HNC5wZGYiLHBsb3RfaGVhdG1hcF9HNCx3aWR0aCA9IDYsIGhlaWdodD0gMykKYGBgIAoKYGBge3IgZmlnLndpZHRoPTgsIGZpZy5oZWlnaHQ9M30KbGlicmFyeShjb3dwbG90KQpwIDwtIGdnZHJhdygpICsKICBkcmF3X3Bsb3QocGxvdF9wcm9maWxlX0c0X0RIWDM2LCB4ID0gMCwgeSA9IDAsIHdpZHRoID0gLjMzLCBoZWlnaHQgPSAxKSArCiAgZHJhd19wbG90KHBsb3RfcHJvZmlsZV9HNF9ub25zaWcsIHggPSAuMzMsIHkgPSAwLCB3aWR0aCA9IC4zMywgaGVpZ2h0ID0gMSkgKwogIGRyYXdfcGxvdChwbG90X3Byb2ZpbGVfRzRfZW5oYWN0LCB4ID0gMC42NiwgeSA9IDAsIHdpZHRoID0gLjMzLCBoZWlnaHQgPSAxKQpwCmdnc2F2ZSgicGFuZWxzL3Byb2ZpbGVzX0c0X3BlYWtfZW5oLnBkZiIscCx3aWR0aD04LCBoZWlnaHQ9MykKYGBgCgoKYGBge3IgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTV9CgpwIDwtIGdnZHJhdygpICsKICBkcmF3X3Bsb3QocGxvdF9oZWF0bWFwX0c0LCB4ID0gLjAsIHkgPSAwLCB3aWR0aCA9IC41LCBoZWlnaHQgPSAxKSArCiAgZHJhd19wbG90KHBsb3RfcHJvZmlsZV9HNF9ESFgzNiwgeCA9IC41LCB5ID0gMC41LCB3aWR0aCA9IC4yNSwgaGVpZ2h0ID0gLjUpICsKICBkcmF3X3Bsb3QocGxvdF9wcm9maWxlX0c0X0ZBTkNKLCB4ID0gLjUsIHkgPSAwLCB3aWR0aCA9IC4yNSwgaGVpZ2h0ID0gLjUpICsKICBkcmF3X3Bsb3QocGxvdF9wcm9maWxlX0c0X0RLTywgeCA9IC43NSwgeSA9IDAuNSwgd2lkdGggPSAuMjUsIGhlaWdodCA9IC41KSArCiAgZHJhd19wbG90KHBsb3RfcHJvZmlsZV9HNF9ub25zaWcsIHggPSAwLjc1LCB5ID0gMCwgd2lkdGggPSAuMjUsIGhlaWdodCA9IC41KQpwCmdnc2F2ZSgicGFuZWxzL2hlYXRtYXBfRzRfcGVha3MucGRmIixwLHdpZHRoPTEwLCBoZWlnaHQ9NSkKYGBgCgpgYGB7ciBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9NX0KCnAgPC0gZ2dkcmF3KCkgKwogIGRyYXdfcGxvdChwbG90X2hlYXRtYXBfRzQsIHggPSAuMCwgeSA9IDAsIHdpZHRoID0gLjUsIGhlaWdodCA9IDEpICsKICBkcmF3X3Bsb3QocGxvdF9wcm9maWxlX0c0X0RLTywgeCA9IC41LCB5ID0gMC41LCB3aWR0aCA9IC4yNSwgaGVpZ2h0ID0gLjUpICsKICBkcmF3X3Bsb3QocGxvdF9wcm9maWxlX0c0X25vbnNpZywgeCA9IC41LCB5ID0gMCwgd2lkdGggPSAuMjUsIGhlaWdodCA9IC41KSArCiAgZHJhd19wbG90KHBsb3RfcHJvZmlsZV9HNF9wcm9hY3QsIHggPSAuNzUsIHkgPSAwLjUsIHdpZHRoID0gLjI1LCBoZWlnaHQgPSAuNSkgKwogIGRyYXdfcGxvdChwbG90X3Byb2ZpbGVfRzRfZW5oYWN0LCB4ID0gMC43NSwgeSA9IDAsIHdpZHRoID0gLjI1LCBoZWlnaHQgPSAuNSkKcApnZ3NhdmUoInBhbmVscy9oZWF0bWFwX0c0X3BlYWtzX3Byb19lbmgucGRmIixwLHdpZHRoPTEwLCBoZWlnaHQ9NSkKYGBgCgojIyBSIGxvb3BzCgoKYGBge3IgZmlnLndpZHRoPTQsIGZpZy5oZWlnaHQ9NCwgZXJyb3I9RixlY2hvPUYscHJvbXB0PUYsd2FybmluZz1GfQpid19kaXIgPC0gIi9Wb2x1bWVzL0RBVEEvREFUQS9QdWNrL2JpZ3dpZy8vIgpCV3NfUmxvb3AgPC0gcGFzdGUwKGJ3X2RpcixsaXN0LmZpbGVzKGJ3X2RpcixwYXR0ZXJuPSJSbG9vcF8uK19jb21iaW5lZC5idyIpKQpwbG90X3Byb2ZpbGVfUmxvb3BfREtPIDwtIHBsb3RfYndfcHJvZmlsZShid2ZpbGVzID0gQldzX1Jsb29wLGxvY2kgPSAiLi4vcGVha3MvRzRfQ25UX2NvbWJpbmVkX3BlYWtzX0RFU2VxX0RLT19zaWcuYmVkIiwgbW9kZT0iY2VudGVyIiwgbGFiZWxzID0gY2xlYW4oQldzX1Jsb29wKSxzaG93X2Vycm9yPVQsY29sb3JzID0gbXlwYWwsIHZlcmJvc2U9RiwgcmVtb3ZlX3RvcD0wLjAwMSkgKyBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzPWMoMCwxNSkpCnBsb3RfcHJvZmlsZV9SbG9vcF9ES08gCmBgYApgYGB7ciBmaWcud2lkdGg9NCwgZmlnLmhlaWdodD00LCBlcnJvcj1GLGVjaG89Rixwcm9tcHQ9Rix3YXJuaW5nPUZ9CnBsb3RfcHJvZmlsZV9SbG9vcF9ESFgzNiA8LSBwbG90X2J3X3Byb2ZpbGUoYndmaWxlcyA9IEJXc19SbG9vcCxsb2NpID0gIi4uL3BlYWtzL0c0X0NuVF9jb21iaW5lZF9wZWFrc19ERVNlcV9ESFgzNl9zaWcuYmVkIiwgbW9kZT0iY2VudGVyIiwgbGFiZWxzID0gY2xlYW4oQldzX1Jsb29wKSxzaG93X2Vycm9yPVQsY29sb3JzID0gbXlwYWwsIHZlcmJvc2U9RikgKyBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzPWMoMCwxNSkpCnBsb3RfcHJvZmlsZV9SbG9vcF9ESFgzNgpgYGAKCmBgYHtyIGZpZy53aWR0aD00LCBmaWcuaGVpZ2h0PTQsIGVycm9yPUYsZWNobz1GLHByb21wdD1GLHdhcm5pbmc9Rn0KcGxvdF9wcm9maWxlX1Jsb29wX0ZBTkNKIDwtIHBsb3RfYndfcHJvZmlsZShid2ZpbGVzID0gQldzX1Jsb29wLGxvY2kgPSAiLi4vcGVha3MvRzRfQ25UX2NvbWJpbmVkX3BlYWtzX0RFU2VxX0ZBTkNKX3NpZy5iZWQiLCBtb2RlPSJjZW50ZXIiLCBsYWJlbHMgPSBjbGVhbihCV3NfUmxvb3ApLHNob3dfZXJyb3I9VCxjb2xvcnMgPSBteXBhbCwgdmVyYm9zZT1GKSArIHNjYWxlX3lfY29udGludW91cyhsaW1pdHM9YygwLDE1KSkKcGxvdF9wcm9maWxlX1Jsb29wX0ZBTkNKCmBgYAoKYGBge3IgZmlnLndpZHRoPTQsIGZpZy5oZWlnaHQ9NCwgZXJyb3I9RixlY2hvPUYscHJvbXB0PUYsd2FybmluZz1GfQpwbG90X3Byb2ZpbGVfUmxvb3Bfbm9uc2lnIDwtIHBsb3RfYndfcHJvZmlsZShid2ZpbGVzID0gQldzX1Jsb29wLGxvY2kgPSAiLi4vcGVha3MvRzRfQ25UX2NvbWJpbmVkX3BlYWtzX0RFU2VxX25vbnNpZy5iZWQiLCBtb2RlPSJjZW50ZXIiLCBsYWJlbHMgPSBjbGVhbihCV3NfUmxvb3ApLHNob3dfZXJyb3I9VCxjb2xvcnMgPSBteXBhbCwgdmVyYm9zZT1GKSArIHNjYWxlX3lfY29udGludW91cyhsaW1pdHM9YygwLDE1KSkKcGxvdF9wcm9maWxlX1Jsb29wX25vbnNpZwpgYGAKCmBgYHtyfQpnZ3NhdmUoInBsb3RzL3Byb2ZpbGVfUmxvb3BfREhYMzYucGRmIixwbG90X3Byb2ZpbGVfUmxvb3BfREhYMzYsd2lkdGggPSAzLCBoZWlnaHQ9IDMpCmdnc2F2ZSgicGxvdHMvcHJvZmlsZV9SbG9vcF9GQU5DSi5wZGYiLHBsb3RfcHJvZmlsZV9SbG9vcF9GQU5DSix3aWR0aCA9IDMsIGhlaWdodD0gMykKZ2dzYXZlKCJwbG90cy9wcm9maWxlX1Jsb29wX0RLTy5wZGYiLHBsb3RfcHJvZmlsZV9SbG9vcF9ES08sd2lkdGggPSAzLCBoZWlnaHQ9IDMpCmdnc2F2ZSgicGxvdHMvcHJvZmlsZV9SbG9vcF9ub25zaWcucGRmIixwbG90X3Byb2ZpbGVfUmxvb3Bfbm9uc2lnLHdpZHRoID0gMywgaGVpZ2h0PSAzKQpgYGAgCgoKYGBge3IgZmlnLndpZHRoPTYsIGZpZy5oZWlnaHQ9MywgZXJyb3I9RixlY2hvPUYscHJvbXB0PUYsd2FybmluZz1GfQoKem1heCA8LSAyNQoKcjEgPC0gcGxvdF9id19oZWF0bWFwKEJXc19SbG9vcFs0XSwiLi4vcGVha3MvRzRfQ25UX2NvbWJpbmVkX3BlYWtzX0RFU2VxX3NpZ19jYXRlZ29yaWVzLmJlZCIsIG1vZGU9ImNlbnRlciIsIHZlcmJvc2U9Rix6bWF4ID0gem1heCwgb3JkZXJfYnkgPSBvcmQpCnIyIDwtIHBsb3RfYndfaGVhdG1hcChCV3NfUmxvb3BbMl0sIi4uL3BlYWtzL0c0X0NuVF9jb21iaW5lZF9wZWFrc19ERVNlcV9zaWdfY2F0ZWdvcmllcy5iZWQiLCBtb2RlPSJjZW50ZXIiLCB2ZXJib3NlPUYsem1heCA9IHptYXgsIG9yZGVyX2J5ID0gb3JkKQpyMyA8LSBwbG90X2J3X2hlYXRtYXAoQldzX1Jsb29wWzFdLCIuLi9wZWFrcy9HNF9DblRfY29tYmluZWRfcGVha3NfREVTZXFfc2lnX2NhdGVnb3JpZXMuYmVkIiwgbW9kZT0iY2VudGVyIiwgdmVyYm9zZT1GLHptYXggPSB6bWF4LCBvcmRlcl9ieSA9IG9yZCkKcjQgPC0gcGxvdF9id19oZWF0bWFwKEJXc19SbG9vcFszXSwiLi4vcGVha3MvRzRfQ25UX2NvbWJpbmVkX3BlYWtzX0RFU2VxX3NpZ19jYXRlZ29yaWVzLmJlZCIsIG1vZGU9ImNlbnRlciIsIHZlcmJvc2U9Rix6bWF4ID0gem1heCwgb3JkZXJfYnkgPSBvcmQpCgpwbG90X2hlYXRtYXBfUmxvb3AgPC0gZ2dhcnJhbmdlKHIxLHIyLHIzLHI0LHA1LGNvbW1vbi5sZWdlbmQgPSBULCBuY29sID0gNSkKZ2dzYXZlKCJwYW5lbHMvaGVhdG1hcF9SbG9vcC5wZGYiLHBsb3RfaGVhdG1hcF9SbG9vcCx3aWR0aCA9IDYsIGhlaWdodD0gMykKcGxvdF9oZWF0bWFwX1Jsb29wCmBgYAoKYGBge3IgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTV9CgpwIDwtIGdnZHJhdygpICsKICBkcmF3X3Bsb3QocGxvdF9oZWF0bWFwX1Jsb29wLCB4ID0gLjAsIHkgPSAwLCB3aWR0aCA9IC41LCBoZWlnaHQgPSAxKSArCiAgZHJhd19wbG90KHBsb3RfcHJvZmlsZV9SbG9vcF9ESFgzNiwgeCA9IC41LCB5ID0gMC41LCB3aWR0aCA9IC4yNSwgaGVpZ2h0ID0gLjUpICsKICBkcmF3X3Bsb3QocGxvdF9wcm9maWxlX1Jsb29wX0ZBTkNKLCB4ID0gLjUsIHkgPSAwLCB3aWR0aCA9IC4yNSwgaGVpZ2h0ID0gLjUpICsKICBkcmF3X3Bsb3QocGxvdF9wcm9maWxlX1Jsb29wX0RLTywgeCA9IC43NSwgeSA9IDAuNSwgd2lkdGggPSAuMjUsIGhlaWdodCA9IC41KSArCiAgZHJhd19wbG90KHBsb3RfcHJvZmlsZV9SbG9vcF9ub25zaWcsIHggPSAwLjc1LCB5ID0gMCwgd2lkdGggPSAuMjUsIGhlaWdodCA9IC41KQpwCmdnc2F2ZSgicGFuZWxzL3BlYWtfUmxvb3BfaGVhdG1hcC5wZGYiLHAsd2lkdGg9MTAsIGhlaWdodD01KQpgYGAKCmBgYHtyIGZpZy53aWR0aD04LCBmaWcuaGVpZ2h0PTN9CgpwIDwtIGdnZHJhdygpICsKICBkcmF3X3Bsb3QocGxvdF9wcm9maWxlX1Jsb29wX0RIWDM2LCB4ID0gMCwgeSA9IDAsIHdpZHRoID0gLjMzLCBoZWlnaHQgPSAxKSArCiAgZHJhd19wbG90KHBsb3RfcHJvZmlsZV9SbG9vcF9ES08sIHggPSAuMzMsIHkgPSAwLCB3aWR0aCA9IC4zMywgaGVpZ2h0ID0gMSkgKwogIGRyYXdfcGxvdChwbG90X3Byb2ZpbGVfUmxvb3Bfbm9uc2lnLCB4ID0gMC42NiwgeSA9IDAsIHdpZHRoID0gLjMzLCBoZWlnaHQgPSAxKQpwCmdnc2F2ZSgicGFuZWxzL3BlYWtfUmxvb3BfcHJvZmlsZXMucGRmIixwLHdpZHRoPTgsIGhlaWdodD0zKQpgYGAKCgpgYGB7ciBmaWcud2lkdGg9MiwgZmlnLmhlaWdodD0yfQpjb3ZfcHJvSGkgPC0gYndfbG9jaShCV3MsIGxvY2kgPSAiLi4vcGVha3MvRzRfQ25UX2NvbWJpbmVkX3BlYWtzX0RFU2VxX0RLT19zaWcuYmVkIixsYWJlbHMgPSBjbGVhbihCV3MpKQpjb3ZSX3Byb0hpIDwtIGJ3X2xvY2koQldzX1Jsb29wLCBsb2NpID0gIi4uL3BlYWtzL0c0X0NuVF9jb21iaW5lZF9wZWFrc19ERVNlcV9ES09fc2lnLmJlZCIsbGFiZWxzID0gY2xlYW4oQldzKSkKCmRmIDwtIGNiaW5kKGFzLmRhdGEuZnJhbWUoY292X3Byb0hpKVs2OjldLGFzLmRhdGEuZnJhbWUoY292Ul9wcm9IaSlbNjo5XSkKCmNvbG5hbWVzKGRmKSA8LSBjKCJGQU5DSiIsIkRIWDM2IiwiREtPIiwiV1QiLCJSX0ZBTkNKIiwiUl9ESFgzNiIsIlJfREtPIiwiUl9XVCIpCmRmMiA8LSBsb2cyKGRmKSAKZ2dzY2F0dGVyKGRmLHggPSJXVCIseT0iUl9XVCIsc2l6ZSA9IDAuMiwgYWxwaGE9MC4xKSArIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gMCwgbGluZXR5cGU9ImRhc2hlZCIsIHNpemU9MC4xKSArIGNvb3JkX2NhcnRlc2lhbih4bGltPWMoMCwxMDApLHlsaW09YygwLDEwMCkpCmBgYAoKYGBge3IgZmlnLndpZHRoPTIsIGZpZy5oZWlnaHQ9Mn0KbWRmIDwtIG1lbHQoZGYpCgpnZ3Zpb2xpbihtZGYsIHg9InZhcmlhYmxlIix5PSJ2YWx1ZSIsZmlsbD0idmFyaWFibGUiLHBhbGV0dGUgPSBteXBhbCwgYWRkPSJtZWFuX3NkIikgKwogIGNvb3JkX2NhcnRlc2lhbih5bGltPWMoMCwxNSkpCmBgYAo=